// #include<iostream>
// #include<unistd.h>
// using namespace std;

// int main()
// {
//     //1.创建管道
//     int pipefd[2] = {0};
//     if(pipe(pipefd) != 0)
//     {
//         cerr << "pipe error" << endl;
//         return 1;
//     }
//     cout << "pipefd[0]:" << pipefd[0] << endl;
//     cout << "pipefd[1]:" << pipefd[1] << endl;

//     return 0;
// }

// #include<iostream>
// #include<unistd.h>
// #include<strings.h>
// #include<sys/wait.h>
// #include<cstdio>
// #include<cstring>
// using namespace std;

// int main()
// {
//     //1.创建管道
//     int pipefd[2] = {0};
//     if(pipe(pipefd) != 0)
//     {
//         cerr << "pipe error" << endl;
//         return 1;
//     }
    
//     //2.创建子进程
//     pid_t id = fork();
//     if(id < 0)
//     {
//         cerr << "fork error" << endl;
//         return 2;
//     }
//     else if(id == 0)
//     {
//         //child
//         //子进程来进行读取, 子进程就应该关闭写端
//         close(pipefd[1]);

//         #define NUM 1024
//         char buffer[NUM];
//         while(true)
//         {
//             bzero(buffer, sizeof(buffer));
//             ssize_t s = read(pipefd[0], buffer, sizeof(buffer) - 1);
//             if(s > 0)
//             {
//                 //读取成功
//                 buffer[s] = 0;
//                 cout << "子进程收到消息, 内容是: " << buffer << endl;
//             }
//             else if(s == 0)
//             {
//                 cout << "父进程写完了, 我也退出啦" << endl;
//                 break;
//             }
//             else
//             {
//                 //do nothing
//             }
//         }
//         close(pipefd[0]);
//         exit(0);
//     }
//     else
//     {
//         //parent
//         //父进程来进行写入, 就应该关闭读端
//         close(pipefd[0]);

//         const char* msg = "你好子进程, 我是父进程, 这次发送的消息编号是: ";
//         int cnt = 0;
//         while(cnt < 5)
//         {
//             char sendBuffer[1024];
//             sprintf(sendBuffer, "%s %d\n", msg, cnt++);//格式化写入
//             write(pipefd[1], sendBuffer, strlen(sendBuffer));
//             sleep(1);//为了现象明显
//         }
//         close(pipefd[1]);
//         cout << "父进程写完啦" << endl;
//     }

//     pid_t res = waitpid(id, nullptr, 0);
//     if(res > 0)
//         cout << "等待子进程成功" << endl;
    

//     return 0;
// }


//父进程控制子进程
// #include<iostream>
// #include<unistd.h>
// #include<sys/wait.h>
// #include<vector>
// #include<unordered_map>
// #include<cstdio>
// #include<cstdlib>
// #include<cassert>
// #include<ctime>
// #include<cstring>
// using namespace std;

// typedef void(*functor)();
// vector<functor> functors; // 方法集合
// unordered_map<uint32_t, string> info;

// void f1()
// {
//     cout << "这是一个处理日志的任务, 执行的进程ID[" << getpid() << "]" \
//          << "执行时间是[" << time(nullptr) << "]" << endl;
// }

// void f2()
// {
//     cout << "这是一个备份数据的任务, 执行的进程ID[" << getpid() << "]" \
//          << "执行时间是[" << time(nullptr) << "]" << endl;
// }

// void f3()
// {
//     cout << "这是一个处理网络连接的任务, 执行的进程ID[" << getpid() << "]" \
//          << "执行时间是[" << time(nullptr) << "]" << endl;
// }

// void loadFunctor()
// {
//     // 0
//     info.insert({functors.size(), "处理日志的任务"});
//     functors.push_back(f1);

//     // 1
//     info.insert({functors.size(), "备份数据的任务"});
//     functors.push_back(f2);

//     // 2
//     info.insert({functors.size(), "处理网络连接的任务"});
//     functors.push_back(f3);
// }


// int main()
// {
//     //0.加载任务列表
//     loadFunctor();

//     //1.创建管道
//     int pipefd[2] = {0};
//     if(pipe(pipefd) != 0)
//     {
//         cerr << "pipe error" << endl;
//         return 1;
//     }

//     //2.创建子进程
//     pid_t id = fork();
//     if(id < 0)
//     {
//         cerr << "fork error" << endl;
//         return 2;
//     }
//     else if(id == 0)
//     {
//         //child -- read
//         //3.关闭不需要的文件描述符
//         close(pipefd[1]);

//         //4.业务处理
//         while(true)
//         {
//             uint32_t operatorType = 0;
//             //如果有数据就读取, 没有数据就阻塞等待, 等待数据的到来
//             ssize_t s = read(pipefd[0], &operatorType, sizeof(operatorType));
//             if(s == 0)
//             {
//                 //读完了
//                 cout << "我要退出啦, 我是给人打工的, 老板都走了..." << endl;
//                 break;
//             }
//             assert(s == sizeof(operatorType));
//             (void)s;

//             if(operatorType < functors.size())
//             {
//                 functors[operatorType]();
//             }
//             else
//             {
//                 cerr << "bug ? operatorType = " << operatorType << endl;
//             }
//         }
//         close(pipefd[0]);
//         exit(0);
//     }
//     else
//     {
//         srand((unsigned int)time(nullptr)); //生成随机数种子

//         //parent -- write
//         //3.关闭不需要的文件描述符
//         close(pipefd[0]);

//         //4.指派任务
//         int num = functors.size();
//         int cnt = 10;
//         while(cnt--)
//         {
//             //5.形成任务码
//             uint32_t commandCode = rand() % num;
//             cout << "父进程指派任务完成, 任务是: " << info[commandCode] \
//                  << " 任务的编号是: " << cnt << endl;
            
//             //向指定的进程下达执行任务的操作
//             write(pipefd[1], &commandCode, sizeof(commandCode));
//             sleep(1);
//         }
//         close(pipefd[1]);
//         pid_t res = waitpid(id, nullptr, 0);
//         if(res)
//         {
//             cout << "wait success" << endl;
//         }
//     }

//     return 0;
// }




// // 进程池
// #include<iostream>
// #include<unistd.h>
// #include<sys/wait.h>
// #include<vector>
// #include<unordered_map>
// #include<cstdio>
// #include<cstdlib>
// #include<cassert>
// #include<ctime>
// #include<cstring>
// using namespace std;

// typedef void(*functor)();
// vector<functor> functors; // 方法集合
// unordered_map<uint32_t, string> info;

// typedef std::pair<int32_t/*进程pid*/, int32_t/*该进程对应的管道写端fd*/> elem; 
// int processNum = 5;


// void f1()
// {
//     cout << "这是一个处理日志的任务, 执行的进程ID[" << getpid() << "]" \
//          << "执行时间是[" << time(nullptr) << "]" << endl;
// }

// void f2()
// {
//     cout << "这是一个备份数据的任务, 执行的进程ID[" << getpid() << "]" \
//          << "执行时间是[" << time(nullptr) << "]" << endl;
// }

// void f3()
// {
//     cout << "这是一个处理网络连接的任务, 执行的进程ID[" << getpid() << "]" \
//          << "执行时间是[" << time(nullptr) << "]" << endl;
// }

// void loadFunctor()
// {
//     // 0
//     info.insert({functors.size(), "处理日志的任务"});
//     functors.push_back(f1);

//     // 1
//     info.insert({functors.size(), "备份数据的任务"});
//     functors.push_back(f2);

//     // 2
//     info.insert({functors.size(), "处理网络连接的任务"});
//     functors.push_back(f3);
// }

// void work(int blockFd)
// {
//     cout << "进程[" << getpid() << "]" << "开始工作" << endl;
//     //子进程核心工作的代码
//     while(true)
//     {
//         //a.阻塞等待   b.获取任务列表
//         uint32_t operatorCode = 0;
//         ssize_t s = read(blockFd, &operatorCode, sizeof(operatorCode));
//         if(s == 0)
//         {
//             //读完了
//             break;
//         }
//         assert(s == sizeof(uint32_t));
//         (void)s;

//         //c.处理任务
//         if(operatorCode < functors.size())
//             functors[operatorCode]();
//     }

//     cout << "进程[" << getpid() << "]" << "结束工作" << endl;
// }

// int main()
// {
//     loadFunctor();

//     vector<elem> assignMap;
    
//     //创建processNum个进程
//     for(int i = 0; i < processNum; i++)
//     {
//         //定义保存管道
//         int pipefd[2] = {0};
//         // 创建管道
//         int res = pipe(pipefd);
//         assert(res != -1);

//         //创建子进程
//         pid_t id = fork();
//         if(id == 0)
//         {
//             //子进程--读取
//             close(pipefd[1]);

//             //子进程执行
//             work(pipefd[0]);

//             close(pipefd[0]);
//             exit(0);
//         }
//         //父进程做的事情
//         close(pipefd[0]);

//         elem e(id, pipefd[1]);
//         assignMap.push_back(e);
        
//     }

//     return 0;
// }


// //进程池
// #include<iostream>
// #include<unistd.h>
// #include<sys/wait.h>
// #include<vector>
// #include<unordered_map>
// #include<cstdio>
// #include<cstdlib>
// #include<cassert>
// #include<ctime>
// #include<cstring>
// using namespace std;

// typedef void(*functor)();
// vector<functor> functors;//方法集合
// unordered_map<uint32_t, string> info;

// typedef pair<int32_t, int32_t> elem;
// int processNum = 5;


// void f1()
// {
//     cout << "这是一个处理日志的任务, 执行的进程ID[" << getpid() \
//          << "]" << "执行时间是[" << time(nullptr) << "]" << endl;
// }

// void f2()
// {
//     cout << "这是一个备份数据的任务, 执行的进程ID[" << getpid() \
//          << "]" << "执行时间是[" << time(nullptr) << "]" << endl;
// }

// void f3()
// {
//     cout << "这是一个处理网络连接的任务, 执行的进程ID[" << getpid() \
//          << "]" << "执行时间是[" << time(nullptr) << "]" << endl;
// }

// void loadFunctor()
// {
//     // 0
//     info.insert({functors.size(), "处理日志的任务"});
//     functors.push_back(f1);

//     // 1
//     info.insert({functors.size(), "备份数据的任务"});
//     functors.push_back(f2);

//     // 2
//     info.insert({functors.size(), "处理网络连接的任务"});
//     functors.push_back(f3);
// }

// int main()
// {
//     loadFunctor();

//     vector<elem> assignMap;

//     //创建processNum个进程
//     for(int i = 0; i < processNum; i++)
//     {
//         //定义保存管道fd的对象
//         int pipefd[2] = {0};
//         //创建管道
//         pipefd(pi)
//     }

//     return 0;
// }


